// 给定一个只包括 '('，')'，'{'，'}'，'['，']' 的字符串 s ，判断字符串是否有效。
// 有效字符串需满足：
// 左括号必须用相同类型的右括号闭合。
// 左括号必须以正确的顺序闭合。

/**
 * 思路:
 *  使用栈来解匹配的问题
 *  先来分析一下 这里有三种不匹配的情况，
    第一种情况，字符串里左方向的括号多余了 ，所以不匹配。
        已经遍历完了字符串，但是栈不为空，说明有相应的左括号没有右括号来匹配，所以return false
    第二种情况，括号没有多余，但是 括号的类型没有匹配上。 
        遍历字符串匹配的过程中，发现栈里没有要匹配的字符。所以return false
    第三种情况，字符串里右方向的括号多余了，所以不匹配。 
        遍历字符串匹配的过程中，栈已经为空了，没有匹配的字符了，说明右括号没有找到对应的左括号return false

    那么什么时候说明左括号和右括号全都匹配了呢，就是字符串遍历完之后，栈是空的，就说明全都匹配了。
 * @param s 
 * @returns 
 */
function isValid(s: string): boolean {
    const stack = [];
    for (let i = 0; i < s.length; i++) {
        let x = s[i];
        switch (x) {
            case '(':
                stack.push(')');
                break;
            case '{':
                stack.push('}');
                break;
            case '[':
                stack.push(']');
                break;
            default:
                if (x !== stack.pop()) {
                    return false;
                }
        }
    }
    return stack.length === 0;
};

